package cn.iocoder.yudao.module.vos.utils;

import cn.hutool.http.HttpRequest;
import cn.hutool.http.HttpResponse;
import cn.hutool.json.JSONUtil;
import cn.hutool.json.JSONObject;

import java.nio.charset.StandardCharsets;

/**
 * EIMS /smsjob 工具类（不加密版本，完全不传 content 字段）
 */
public class EimsSmsJobUtils {

    private static final String DEFAULT_VERSION = "1.0";

    /** 例如：http://ip:20003 */
    private final String baseUrl;
    private final String account;
    /** 明文密码，接口文档里的 password */
    private final String password;

    public EimsSmsJobUtils(String baseUrl, String account, String password) {
        this.baseUrl = trimTrailingSlash(baseUrl);
        this.account = account;
        this.password = password;
    }

    private String trimTrailingSlash(String url) {
        if (url == null) {
            return "";
        }
        if (url.endsWith("/")) {
            return url.substring(0, url.length() - 1);
        }
        return url;
    }

    /**
     * 1）立即任务：号码直接写在 numbers（numbersrc = 0）
     *
     * @param jobName    任务名称
     * @param numbersCsv 逗号分隔的号码串：13800000001,13800000002
     */
    public SmsJobResponse createImmediateJobWithNumbers(String jobName,
                                                        String numbersCsv) {
        JSONObject body = buildBaseBody();
        body.set("job", jobName);
        // 不传 content 字段
        body.set("numbersrc", 0);            // 0：numbers 是号码
        body.set("numbers", numbersCsv);     // 逗号分隔
        // jobtype 默认 0：立即发送
        return doPostSmsJob(body);
    }

    /**
     * 2）立即任务：号码文件 URL（numbersrc = 1）
     *
     * @param jobName        任务名称
     * @param numbersFileUrl 号码文件 URL（xls）
     */
    public SmsJobResponse createImmediateJobWithFile(String jobName,
                                                     String numbersFileUrl) {
        JSONObject body = buildBaseBody();
        body.set("job", jobName);
        // 不传 content 字段
        body.set("numbersrc", 1);               // 1：numbers 是 URL
        body.set("numbers", numbersFileUrl);    // 平台去拉取 xls
        return doPostSmsJob(body);
    }

    /**
     * 3）每日任务：每天固定时间，号码文件 URL（jobtype = 3）
     *    只负责上传号码 + 建任务，不传 content。
     *
     * @param jobName        任务名称
     * @param numbersFileUrl 号码文件 URL
     * @param period         循环次数，为 null 则不传（让平台走默认）
     * @param hour           每天几点（0-23）
     * @param min            每小时第几分钟（0-59）
     */
    public SmsJobResponse createDailyJobWithFile(String jobName,
                                                 String numbersFileUrl,
                                                 Integer period,
                                                 int hour,
                                                 int min) {
        JSONObject body = buildBaseBody();
        body.set("job", jobName);
        // 不传 content 字段
        body.set("numbersrc", 1);
        body.set("numbers", numbersFileUrl);

        body.set("jobtype", 3);    // 3: daily
        body.set("hour", hour);
        body.set("min", min);
        if (period != null) {
            body.set("period", period);
        }
        // 如需指定开始日期时间，可再传 planstarttm（秒级时间戳）
        // body.set("planstarttm", planStartEpochSecond);
        return doPostSmsJob(body);
    }

    /**
     * 公共字段：version / account / password
     */
    private JSONObject buildBaseBody() {
        JSONObject body = new JSONObject();
        body.set("version", DEFAULT_VERSION);
        body.set("account", account);
        body.set("password", password);  // 明文密码
        return body;
    }

    /**
     * POST /smsjob
     */
    private SmsJobResponse doPostSmsJob(JSONObject body) {
        String url = baseUrl + "/smsjob";
        String reqJson = body.toString();

        // ==== 打印请求信息 ====
        System.out.println("=== EIMS /smsjob Request ===");
        System.out.println("URL    : " + url);
        System.out.println("Method : POST");
        System.out.println("Body   : " + reqJson);

        HttpResponse httpResp = HttpRequest.post(url)
                .charset(StandardCharsets.UTF_8)
                .header("Content-Type", "application/json;charset=utf-8")
                .body(reqJson)
                .timeout(10_000)
                .execute();

        String respBody = httpResp.body();

        // ==== 打印响应信息 ====
        System.out.println("=== EIMS /smsjob Response ===");
        System.out.println("HTTP Status : " + httpResp.getStatus());
        System.out.println("Resp Body   : " + respBody);

        SmsJobResponse result = new SmsJobResponse();
        result.setHttpStatus(httpResp.getStatus());
        result.setRawBody(respBody);

        if (JSONUtil.isJson(respBody)) {
            JSONObject json = JSONUtil.parseObj(respBody);
            // 文档示例：{"status":0, "jobid":2}
            result.setStatus(json.getInt("status", null));
            result.setJobid(json.getLong("jobid", null));
        }
        return result;
    }

    /**
     * 简单响应对象
     */
    public static class SmsJobResponse {
        private int httpStatus;
        private Integer status;
        private Long jobid;
        private String rawBody;

        public int getHttpStatus() {
            return httpStatus;
        }

        public void setHttpStatus(int httpStatus) {
            this.httpStatus = httpStatus;
        }

        public Integer getStatus() {
            return status;
        }

        public void setStatus(Integer status) {
            this.status = status;
        }

        public Long getJobid() {
            return jobid;
        }

        public void setJobid(Long jobid) {
            this.jobid = jobid;
        }

        public String getRawBody() {
            return rawBody;
        }

        public void setRawBody(String rawBody) {
            this.rawBody = rawBody;
        }

        @Override
        public String toString() {
            return "SmsJobResponse{" +
                    "httpStatus=" + httpStatus +
                    ", status=" + status +
                    ", jobid=" + jobid +
                    ", rawBody='" + rawBody + '\'' +
                    '}';
        }
    }

    /**
     * 简单 main 方法示例
     */
    public static void main(String[] args) {
        // ======= 1. 初始化客户端（把下面三个参数改成真实值）=======
        String baseUrl = "http://103.176.197.11:20003";   // TODO: 换成对方给你的地址
        String account = "0024C0033";                     // TODO: 换成你的账号
        String password = "NzLPLGM5";                     // TODO: 换成你的密码

        EimsSmsJobUtils client = new EimsSmsJobUtils(baseUrl, account, password);

        // ======= 2. 调用示例 1：立即任务，号码直接写在 numbers =======
        SmsJobResponse resp1 = client.createImmediateJobWithNumbers(
                "job_with_numbers_demo",
                "09286539406"
        );
        System.out.println("立即任务（numbers）响应：");
        System.out.println(resp1);

//        // ======= 3. 调用示例 2：立即任务，号码文件 URL =======
//        SmsJobResponse resp2 = client.createImmediateJobWithFile(
//                "job_with_file_demo",
//                "http://your-server/sms_demo.xls"  // TODO: 换成你自己的 xls 地址
//        );
//        System.out.println("立即任务（file）响应：");
//        System.out.println(resp2);
//
//        // ======= 4. 调用示例 3：每日任务，号码文件 URL =======
//        SmsJobResponse resp3 = client.createDailyJobWithFile(
//                "job_daily_demo",
//                "http://your-server/sms_daily.xls", // TODO: 换成你自己的 xls 地址
//                10,   // period：执行 10 次
//                9,    // 每天 9 点
//                0     // 00 分
//        );
//        System.out.println("每日任务（file）响应：");
//        System.out.println(resp3);
    }
}
